#include "global.h"

/* 定时器参数宏定义 */
#define TIM_PERIOD 1000 // ARR自动重装载值（实际计数值为TIM_PERIOD-1）
#define TIM_PRESCALER 9 // PSC预分频系数（实际分频值为TIM_PRESCALER-1）
/* 定时周期计算公式：
   - 定时器时钟 = 系统时钟 / (PSC + 1)
   - 中断周期 = (ARR + 1) * (1/定时器时钟)
   参数计算（基于72MHz系统时钟）：
   - 预分频后频率 = 72MHz / 72 = 1MHz
   - 定时周期 = (1000) * (1/MHz) = 1ms */

/**
 * @brief 初始化PWM MOTOR输出
 *
 * 该函数配置TIM2定时器，设置PWM输出到GPIO引脚PA0、PA1、PB2、P3
 */
void pwmMotor_init(void)
{
    /* 开启相关外设时钟 */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);  // 开启TIM2定时器的时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 开启GPIOA端口的时钟

    /* GPIO初始化配置 */
    GPIO_InitTypeDef GPIO_InitStructure = {
        .GPIO_Mode = GPIO_Mode_AF_PP,  // 设置为复用推挽输出模式
        .GPIO_Speed = GPIO_Speed_50MHz // 配置引脚速率为50MHz
    };
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; // 配置PA0、PA1、PA2、PA3为复用功能引脚
    GPIO_Init(GPIOA, &GPIO_InitStructure);                                           // 初始化GPIOA

    /* 配置TIM2为内部时钟源 */
    TIM_InternalClockConfig(TIM2); // 选择TIM2定时器为内部时钟源

    /* 配置时基单元 */
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;              // 定义时基单元配置结构体
    TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;     // 设置时钟分频为1（无分频）
    TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; // 设置计数器模式为向上计数
    TIM_TimeBaseInitStructure.TIM_Period = TIM_PERIOD - 1;          // 设置自动重载寄存器（ARR）值
    TIM_TimeBaseInitStructure.TIM_Prescaler = TIM_PRESCALER - 1;    // 设置预分频器值
    TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;            // 设置重复计数器（仅高级定时器使用）
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);             // 配置TIM2的时基单元

    /* 配置输出比较功能 */
    TIM_OCInitTypeDef TIM_OCInitStructure;                        // 定义输出比较配置结构体
    TIM_OCStructInit(&TIM_OCInitStructure);                       // 初始化结构体（设置默认值）
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;             // 设置输出比较模式为PWM模式1
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;     // 设置输出极性为高
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 启用PWM输出
    TIM_OCInitStructure.TIM_Pulse = 0;                            // 初始的CCR值为0

    // 配置各个通道的PWM输出
    TIM_OC1Init(TIM2, &TIM_OCInitStructure); // 配置通道1对应PA0
    TIM_OC2Init(TIM2, &TIM_OCInitStructure); // 配置通道2对应PA1
    TIM_OC3Init(TIM2, &TIM_OCInitStructure); // 配置通道3对应PA2
    TIM_OC4Init(TIM2, &TIM_OCInitStructure); // 配置通道4对应PA3

    /* 启动TIM2定时器 */
    TIM_Cmd(TIM2, ENABLE); // 启动TIM2定时器，使其开始计时
}

/* 设置PWM周期，即ARR的值 */
void pwmMotor_setPeriod(uint16_t period)
{
    TIM_Cmd(TIM2, DISABLE);          // 禁用TIM2定时器，准备更新ARR
    TIM_SetCounter(TIM2, 0);         // 重置计数器
    TIM_SetAutoreload(TIM2, period); // 设置新的ARR值，调整PWM周期
    TIM_Cmd(TIM2, ENABLE);           // 重新启用TIM2定时器
}

/* 设置PWM预分频值，即PSC的值 */
void pwmMotor_setPrescaler(uint16_t prescaler)
{
    TIM_PrescalerConfig(TIM2, prescaler, TIM_PSCReloadMode_Immediate); // 配置预分频器值
}

/* 设置PWM通道1的占空比，即CCR1的值 */
void pwmMotor_setCompare1(uint16_t compare)
{
    TIM_SetCompare1(TIM2, compare); // 设置CCR1的值，控制通道1的占空比
}

/* 设置PWM通道2的占空比，即CCR2的值 */
void pwmMotor_setCompare2(uint16_t compare)
{
    TIM_SetCompare2(TIM2, compare); // 设置CCR2的值，控制通道2的占空比
}

/* 设置PWM通道3的占空比，即CCR3的值 */
void pwmMotor_setCompare3(uint16_t compare)
{
    TIM_SetCompare3(TIM2, compare); // 设置CCR3的值，控制通道3的占空比
}

/* 设置PWM通道4的占空比，即CCR4的值 */
void pwmMotor_setCompare4(uint16_t compare)
{
    TIM_SetCompare4(TIM2, compare); // 设置CCR4的值，控制通道4的占空比
}
